package controllers;

import java.awt.image.renderable.RenderableImage;
import java.io.File;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebService;

import org.joda.time.DateTime;

import controllers.Security;

import models.Anuncio;
import models.Bairro;
import models.Caracteristica;
import models.Cidade;
import models.Comentario;
import models.Estado;
import models.Imovel;
import models.Notificacao;
import models.TipoImovel;
import models.Transacao;
import models.Usuario;
import play.Play;
import play.data.validation.Valid;
import play.data.validation.Validation;
import play.mvc.Controller;

/**
 * Controlador para o CRUD de Contatos. Protegido pelo modulo Secure.
 * 
 * @author Marcos
 * 
 */
@WebService
public class Imovels extends Controller {

	// static private List<Imovel> imovels = null;

	public static void listar() {
		Usuario u = Usuario.find("byEmail", Security.connected()).first();
		List<Imovel> imovels = u.imovels;
		render(imovels);
	}

	public static Imovel getId(Long id) {
		Imovel imovel = Imovel.findById(id);
		return imovel;
	}

	public static void buscaAvancada() {

		List<Imovel> imovels = Imovel.find("byStatus", true).fetch();
		List<TipoImovel> tipoImovel = TipoImovels.listaTipoImovel();
		List<Transacao> transacao = Transacaos.listaTransacao();
		List<Estado> estado = Estados.listaEstado();
		List<Cidade> cidade = Cidades.listaCidade();
		List<Bairro> bairro = Bairros.listaBairro();
		render(imovels, tipoImovel, transacao, estado, cidade, bairro);
	}

	public static void buscarImovel(Imovel imovel) {

		List<TipoImovel> tipoImovel = TipoImovels.listaTipoImovel();
		List<Transacao> transacao = Transacaos.listaTransacao();
		List<Bairro> bairro = Bairros.listaBairro();
		List<Imovel> imovels = Imovel.find(
				"byQuartosAndTRANSACAO_IDAndTIPOIMOVEL_IDAndBairro",
				imovel.quartos, imovel.transacao, imovel.tipoImovel,
				imovel.bairro).fetch();
		List<Estado> estado = Estados.listaEstado();
		List<Cidade> cidade = Cidades.listaCidade();
		renderTemplate("imovels/buscaAvancada.html", imovels, tipoImovel,
				transacao, estado, cidade, bairro);
	}

	public static void anunciarNovamente(Long id) {
		Imovel imovel = Imovel.findById(id);
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, 1);
		Date datavencimento = c.getTime();
		Date datahoje = new Date();
		Anuncio anuncio = new Anuncio(datavencimento, datahoje, imovel);
		anuncio.save();
		imovel.status = true;
		imovel.save();
		flash.success("imovel.anunciarNovamente");
		listar();
	}

	public static void AdicionarComentario(Long id, Comentario comentario) {
		Imovel imovel = Imovel.findById(id);
		Usuario u = Usuario.find("byEmail", Security.connected()).first();
		Calendar c = Calendar.getInstance();
		// Date datahoje = new Date();
		// Comentario comentario = new Comentario();
		// comentario.comentario = coment;
		comentario.dataComentario = c.getTime();
		comentario.imovel = imovel;
		comentario.usuario = u;
		comentario.save();
		enviarNotificacao(id);

	}

	@WebMethod
	public static void enviarNotificacao(Long id)
	{
		Notificacao n = new Notificacao();
		Imovel imovel = Imovel.findById(id);
		Usuario u = imovel.usuario;
		n.msg = u.nome +" comentou seu imóvel!";
		n.usuarios = u;
		n.save();
		flash.success("imovel.comentariofeito");
		mostrar(id);
	}


	public static void cadastrarImovel() {
		List<TipoImovel> tipoImovel = TipoImovels.listaTipoImovel();
		List<Caracteristica> caracteristica = Caracteristicas
				.listaCaracteristicas();
		List<Estado> estado = Estados.listaEstado();
		List<Cidade> cidade = Cidades.listaCidade();
		List<Bairro> bairro = Bairros.listaBairro();
		List<Transacao> transacao = Transacaos.listaTransacao();
		render(tipoImovel, caracteristica, estado, cidade, bairro, transacao);
	}

	public static void cadastroImovel(Imovel imovel) {
		Usuario u = Usuario.find("byEmail", Security.connected()).first();
		/*
		 * Imovel i = Imovel.get(0); i.caracteristicas.add((Caracteristica)
		 * Caracteristica.findById(id));
		 */
		/*
		 * validation.valid(imovel); if (validation.hasErrors()){
		 * flash.error("validacao.erro"); render("@cadastrarImovel",imovel); }
		 * //imovel.usuario = u; //imovel.anuncio = a; for(Long id:
		 * caracteristica){ Caracteristica c = Caracteristica.findById(id);
		 * imovel.caracteristicas.add(c); }
		 */
		if (Validation.hasErrors()) {
			flash.error("validacao.erro");
			renderArgs.put("imovel", imovel);
			// render("@formCadastrar");
			flash.keep();
			validation.keep();
			cadastrarImovel();
		}
		Calendar h = Calendar.getInstance();
		imovel.usuario = u;
		if (imovel.dataPublicacao.after(h.getTime())) {
			imovel.status = false;
		} else {
			imovel.status = true;
		}

		imovel.save();
		flash.success("imovel.cadastrado");
		Calendar c = Calendar.getInstance();
		c.setTime(imovel.dataPublicacao);
		c.add(Calendar.MONTH, 1);
		Date datavencimento = c.getTime();
		Date datahoje = imovel.dataPublicacao;
		Anuncio anuncio = new Anuncio(datavencimento, datahoje, imovel);
		anuncio.save();
		listar();

	}

	public static void alterarImovel(Long id) {
		Usuario usuario = Usuario.find("byEmail", Security.connected()).first();
		Imovel imovel = Imovel.findById(id);
		List<Caracteristica> caracteristica = Caracteristicas
				.listaCaracteristicas();
		List<Estado> estado = Estados.listaEstado();
		List<Cidade> cidade = Cidades.listaCidade();
		List<Bairro> bairro = Bairros.listaBairro();
		List<Transacao> transacao = Transacaos.listaTransacao();
		List<TipoImovel> tipoImovel = TipoImovels.listaTipoImovel();
		if (imovel.usuario.equals(usuario)) {
			render(imovel, caracteristica, estado, cidade, bairro, transacao,
					tipoImovel);
		}
		listar();
	}

	public static void alteraImovel(Imovel imovel) {
		// Usuario u = Usuario.find("byEmail", Security.connected()).first();
		/*
		 * if (imovel.usuario.equals(u)){ if(validation.hasErrors()){
		 * flash.error("validacao.erro"); render("@AlterarImovel", imovel); }
		 * else{
		 */
		imovel.save();
		flash.success("imovel.alterado");/*
										 * } } else
										 * flash.error("erro.permissao");
										 */
		listar();
	}

	public static void excluir(Long id) {
		Usuario usuario = Usuario.find("byEmail", Security.connected()).first();
		Imovel imovel = Imovel.findById(id);
		if (imovel.usuario.equals(usuario)) {
			imovel.delete();
			flash.success("imovel.removido");
		} else
			flash.error("erro.permissao");
		listar();
	}

	public static void encerrarAnuncio(Long id) {
		Imovel imovel = Imovel.findById(id);
		imovel.status = false;
		imovel.pago = false;
		imovel.save();
		flash.success("imovel.encerrado");
		listar();

	}

	public static void marcarFavorito(Long id) {
		Imovel imovel = Imovel.findById(id);
		Usuario u = Usuario.find("byEmail", Security.connected()).first();
		imovel.usuarios.add(u);
		u.favoritos.add(imovel);
		imovel.save();
		u.save();
		mostrar(id);
	}

	public static void locarDestaque(Long id) {
		Imovel imovel = Imovel.findById(id);
		imovel.pago = true;
		imovel.save();
		anunciarNovamente(id);
		listar();
	}
	
	@WebMethod
	public static void buscarBairro(String bairro){
		List<Imovel> imovels = Imovel.find("byBairro", bairro).fetch();
		render(imovels);
	}

	public static void desmarcarFavorito(Long id) {
		Imovel imovel = Imovel.findById(id);
		Usuario u = Usuario.find("byEmail", Security.connected()).first();
		u.favoritos.remove(imovel);
		imovel.usuarios.remove(u);
		u.save();
		imovel.save();
		mostrar(id);
	}

	public static void mostrar(Long id) {
		List<TipoImovel> tipoImovel = TipoImovels.listaTipoImovel();
		List<Estado> estado = Estados.listaEstado();
		List<Cidade> cidade = Cidades.listaCidade();
		List<Bairro> bairro = Bairros.listaBairro();
		List<Transacao> transacao = Transacaos.listaTransacao();
		List<Usuario> usuario = Usuario.findAll();

		try {
			Boolean favorito = false;
			Usuario u = null;
			Imovel imovel = Imovel.findById(id);
			List<Comentario> comentario = Comentario.find("byImovel_id", id)
					.fetch();
			List<Caracteristica> caracteristica = imovel.caracteristicas;
			if (Security.isConnected()) {
				u = Usuario.find("byEmail", Security.connected()).first();
				if (imovel.usuarios.contains(u))
					favorito = true;
			}
			if (imovel.status == true) {
				render(imovel, caracteristica, cidade, estado, bairro, usuario,
						tipoImovel, transacao, comentario, favorito, u);
			} else {
				flash.error("buscar.error");
				buscaAvancada();
			}
		} catch (Exception e) {
			e.printStackTrace();
			flash.error("buscar.error");
			buscaAvancada();
		}
	}

	public static void mostrarFoto1(Long id) {
		Imovel imovel = Imovel.findById(id);
		if (imovel.imagem1.exists())
			renderBinary(imovel.imagem1.getFile());
		else
			renderBinary(new File(Play.applicationPath
					+ "/public/images/vazio.gif"));
	}

	public static void mostrarFoto2(Long id) {
		Imovel imovel = Imovel.findById(id);
		if (imovel.imagem2.exists())
			renderBinary(imovel.imagem2.getFile());
		else
			renderBinary(new File(Play.applicationPath
					+ "/public/images/vazio.gif"));
	}

	public static void mostrarFoto3(Long id) {
		Imovel imovel = Imovel.findById(id);
		if (imovel.imagem3.exists())
			renderBinary(imovel.imagem3.getFile());
		else
			renderBinary(new File(Play.applicationPath
					+ "/public/images/vazio.gif"));
	}
}
